/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 
 */
public class Info {

    public Info() {
    }

    public void getClassName() {
    }

    /**
     *
     * The url argument must specify an absolute {@link URL} . * El argumento de URL debe especificar una absoluta (@ link URL). The name El nombre
     * argument is a specifier that is relative to the url argument. * Argumento es un especificador que es relativo a la url argumento.
     * <p> * <p>
     * This method always returns immediately, whether or not the * Este método siempre devuelve inmediatamente, o si no
     * image exists. * Imagen existe. When this applet attempts to draw the image on Cuando este applet intentos de sacar la imagen en
     * the screen, the data will be loaded. * La pantalla, los datos serán cargados. The graphics primitives Los gráficos primitivos
     * that draw the image will incrementally paint on the screen. * Señalar que la imagen cada vez más la pintura en la pantalla.
     *
     * @param   url  an absolute URL giving the base location of the image * @ Param url de una URL absoluta de dar la base de la ubicación de la imagen
     * @param   name the location of the image, relative to the url argument * @ Param nombre de la ubicación de la imagen, en relación con el argumento de la URL
     * @return       the image at the specified URL * @ Regreso de la imagen en la URL especificada
     * @see          Image * @ Ver la imagen
     */
    public Method getMethodName(Object object, String nombreMethod) throws NullPointerException {
        Class clazz=object.getClass();
        Method method = null;
        Method[] methods = clazz.getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            if (methods[i].getName().equals(nombreMethod)) {
                method = methods[i];
            }
        }
        return method;
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public Object invokeGetMethod(Object object, String methodName) {
        Object object1=null;
        Method method = getMethodName(object, methodName);
        try {
            object1=method.invoke(object, null);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        }
        return  object1;

    }
     public Object invokeGetMethod(Object object, String methodName, Object[] params) {
           Object object1=null;
        Method method = getMethodName(object.getClass(), methodName);
        try {
            
            object1=method.invoke(object, params);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        }
        return object1;
    }


    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public Object invokeSetMethod(Object obj, String nombreMethod, Object... args) {
        Object object = null;
        Class clazz = obj.getClass();
        Method method = getMethodName(clazz, nombreMethod);
        try {
            object = method.invoke(obj, args);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        }
        return object;
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public boolean isMethodStatsWith(String prefix, Method method) {
        if (method.getName().startsWith(prefix)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public boolean isMethodEndWith(String prefix, Method method) {
        if (method.getName().endsWith(prefix)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public void existeMethod(Class clazz, String nombreMethod) throws MethodDontExistsException {
        Method method = getMethodName(clazz, nombreMethod);
        if (method != null) {
        } else {
            throw new MethodDontExistsException();
        }
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    public Class getPropertyType(String nombre, Class clazz) {
        Class clase = null;
        try {
            Field field = clazz.getDeclaredField(nombre);
            clase = field.getType();

        } catch (NoSuchFieldException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        }
        return clase;
    }

    /**
     *
     *
     *
     * @param
     * @param
     * @return
     * @see
     */
    @SuppressWarnings("unchecked")
    public void invokeGetMethodByProperty(Object  object, String nombrePropiedad) {
        try {

            //esta el campo que buscamos?, si no lo esta salta una exception
            Class clazz=object.getClass();
            Field field = clazz.getField(nombrePropiedad);
            //hay un metodo que empiza por get con el nombre del campo?
            String fieldName=field.getName();
            Class  class1=field.getType();
            String nu=new  String();
            


            fieldName="get"+fieldName;
            //si no lo esta salta una exception
            Method method=clazz.getMethod(fieldName, null);
            method.invoke(object, null);




        } catch (IllegalAccessException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchFieldException ex) {
            Logger.getLogger(Info.class.getName()).log(Level.SEVERE, null, ex);
        } 

    }
}
